fn main() {
    let name = "rust";
    hello(&name);
    
    format_debug();
    
    format_display();
    
    tuple_type();
    
    array_type();
    
    slice_type();
}


/// slice 切片
/// 大小不固定，类型相同
fn slice_type() {
    // 创建切片
    let arr = [1, 2, 3, 4, 5];
    let slice = &arr[..];
    println!("slice: {:?}", slice);
    // 访问切片
    println!("slice[0]: {}", slice[0]);
    // 切片常用方法
    // len() 获取切片长度
    println!("slice.len(): {}", slice.len());
    // iter() 返回一个迭代器
    for i in slice.iter() {
        println!("i: {}", i);
    }
}

/// array 数组
/// 大小固定(编译是确定)，类型相同
fn array_type() {
    // 创建数组
    let arr = [1, 2, 3, 4, 5];
    println!("arr: {:?}", arr);
    // 访问数组
    println!("arr[0]: {}", arr[0]);
    // 数组常用方法
    // len() 获取数组长度
    println!("arr.len(): {}", arr.len());
    // iter() 返回一个迭代器
    for i in arr.iter() {
        println!("i: {}", i);
    }
    // into_iter() 数组所有权转移给迭代器
    for  i in arr.into_iter() {
        println!("i: {}", i);
    }
    // as_slice()或&arr[..] 将数组转切片
    let slice = arr.as_slice();
    println!("slice: {:?}", slice);
}

/// tuple 元组
/// 长度固定, 类型可以不同
fn tuple_type() {
    // 创建元组
    let tup: (i32, f64, u8) = (500, 6.4, 1);
    // 解构元组
    let (x, y, z) = tup;
    println!("The value of y is: {}", y);
    // 访问元组
    println!("x: {}, y: {}, z: {}", tup.0, tup.1, tup.2);

    // 注: 元组没有len()方法

    // 注：元组不能直接迭代，因为它的每个元素类型可能不同。如果需要迭代，可以将其转换为数组或其他可迭代类型
    let tup2 = (10,20,30);
    let arr = [tup2.0, tup2.1, tup2.2];
    for i in arr.iter()
    {
        println!("i: {}", i);
    }
 }

// format display
fn format_display() {
    #[derive(Debug)]
    struct Person {
        name: String,
        age: i32,
    }
    impl std::fmt::Display for Person {
        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
            write!(f, "person name: {}, age: {}", self.name, self.age)
        }
    }
    let person = Person {
        name: "rust".to_string(),
        age: 18,
    };
    println!("{:#}", person);
}

/// format debug
fn format_debug() {
    #[derive(Debug)]
    struct Person {
        name: String,
        age: i32,
    }
    let person = Person {
        name: "rust".to_string(),
        age: 18,
    };
    println!("name: {}, age: {}", person.name, person.age);
    println!("{:?}",  person);
    println!("{:#?}",  person);
}

/// hello function
/// - param:
///     - name: &str
fn hello(name: &str) {
    // Prints "Hello, world!" to the console
    /*
    *  块注释
    *  块注释
     */
    // println!("Hello, world!");
    println!("Hello, {}", name);
}


